
#include "ThreadPool.h"
ThreadPool::ThreadPool(size_t threadnum) // 构造函数中启动threadnum个线程
    :stop_(false)
{
    for (size_t i = 0; i < threadnum; ++i)
    {
        // 使用lamda表达式创建线程
        threads_.emplace_back([this]
            {
            // printf("thread is %d.\n",syscall(SYS_gettid));
            while(stop_==false)
            {
                std::function<void()> task; //存放出队的元素
                {
                    
                    // 锁的作用域的开始
                    // RAII风格，在锁的作用域结束时释放锁
                    std::unique_lock<std::mutex> lock(this->mutex_);

                    // 等待生产者的条件变量
                    // 待stop_变为true或tasksqueue_不为空。
                    this->condition_.wait(lock,[this]{
                        return ((this->stop_ == true) || (this->tasksqueue_.empty()==false ));
                    });
                    // 在线程池停止之前，如果队列中还有任务，执行完再退出
                    if(this->stop_ == true && this->tasksqueue_.empty() == true)
                    {
                        return;
                    }
                    // 取出队列中的任务
                    task  = std::move(this->tasksqueue_.front());
                    this->tasksqueue_.pop();
                }
            //显示线程id
                // printf("thread is %d.\n",syscall(SYS_gettid));
                task();
                
            }
        });
    }
}
ThreadPool::~ThreadPool() // 在析构函数中停止线程
{
    stop_ = true;
    condition_.notify_all(); // 唤醒所有线程

    for(std::thread& thread: threads_)
    {
        thread.join(); // 等待所有线程结束
    }
}
void ThreadPool::addTask(std::function<void()> task) // 把任务添加到任务队列中
{
    {
        std::lock_guard<std::mutex> lock(this->mutex_);
        tasksqueue_.push(task);
    }

    condition_.notify_one(); // 唤醒一个线程
}

// void show(int no ,const std::string& name)
// {
//     printf("小哥哥门好 ，我是第%d个超级女生%s.\n",no,name.c_str() );
// }

// void test()
// {
//     printf("我是一一只小小小鸟，我要飞！\n");
// }

// int main()
// {
//     // 创建3个线程
//     ThreadPool pool(3);
//     // 
//     std::string name="full";
//     pool.addTask(std::bind(show,10,"full"));
//     sleep(1);

//     pool.addTask(test);
//     sleep(1);

//     pool.addTask(std::bind([]{printf("我是一只小小adasd小鸟，我要飞！\n");}));
//     sleep(1);

// }

// #include<memory>
// class AA
// {
//     public:
//  void show()
//  {
//     printf("我是一只小小小鸟，我要飞！\n");
//  }

//  ~AA()
//  {
//     printf("我正在析构AA\n");
//  }
// };

// void fun(std::shared_ptr<AA> aa)
// {
//     sleep(5);
//     aa->show();

// }

// int main()
// {
//     ThreadPool pool(3);
//     {
//         std::shared_ptr<AA> aa(new AA);
//         pool.addTask(std::bind(&fun,aa));
//     }
//     sleep(10);

//     return 0;
    
// }